#include "key.h"

static uint8_t key_flag = 0;

static void Key_GPIO_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(KEY_GPIO_CLK, ENABLE);

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_InitStructure.GPIO_Pin  = KEY_GPIO_PIN;
    GPIO_Init(KEY_GPIO_PORT, &GPIO_InitStructure);
}

static void Key_EXTI_Config(void)
{
    EXTI_InitTypeDef EXTI_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);                    // 使能AFIO时钟

    GPIO_EXTILineConfig(KEY_GPIO_PORTSOURCE, KEY_GPIO_PINSOURCE);           // 将按键对应的引脚映射到对应的外部中断线

    EXTI_InitStructure.EXTI_Line    = KEY_EXTI_LINE;                        // 选择 EXTI 的信号源
    EXTI_InitStructure.EXTI_Mode    = EXTI_Mode_Interrupt;                  // EXTI 为中断模式
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;                 // 上升沿触发
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;                               // 使能中断
    EXTI_Init(&EXTI_InitStructure);
}

static void Key_NVIC_Config(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);                         // 配置 NVIC 为优先级组 1

    NVIC_InitStructure.NVIC_IRQChannel                   = KEY_EXTI_IRQN;   // 配置中断源
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;               // 配置抢占优先级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority        = 1;               // 配置子优先级
    NVIC_InitStructure.NVIC_IRQChannelCmd                = ENABLE;          // 使能中断通道
    NVIC_Init(&NVIC_InitStructure);
}

void Key_Init(void)
{
    Key_GPIO_Config();
    Key_NVIC_Config();
    Key_EXTI_Config();
}

uint8_t Key_ReadFlag(void)
{
    return key_flag;
}

// 中断服务函数
void KEY_IRQHANDLER(void)
{
    if (EXTI_GetITStatus(KEY_EXTI_LINE) != RESET) // 检测中断标志位
    {
        key_flag = !key_flag;

        EXTI_ClearITPendingBit(KEY_EXTI_LINE); // 清除中断标志位
    }
}